import { By, until } from 'selenium-webdriver';
import { BASE_URL } from './setup.mjs';

/**
 * 登录辅助函数（支持环境变量配置）
 */
export async function login(driver) {
  const username = process.env.E2E_USERNAME || 'Han';
  const password = process.env.E2E_PASSWORD || '123456';
  
  console.log(`尝试登录，用户名: ${username}`);
  await driver.get(`${BASE_URL}/login`);
  
  // 等待登录表单加载
  const usernameInput = await driver.wait(
    until.elementLocated(By.id('username')),
    10000,
    '未找到用户名输入框'
  );
  const passwordInput = await driver.findElement(By.id('password'));
  const submitButton = await driver.findElement(By.css('button[type="submit"]'));
  
  // 输入用户名和密码
  await usernameInput.clear();
  await usernameInput.sendKeys(username);
  await passwordInput.clear();
  await passwordInput.sendKeys(password);
  
  // 提交登录表单
  await submitButton.click();
  
  // 等待登录完成 - 检查是否有错误消息
  try {
    // 先等待一下，看看是否有错误消息出现
    await driver.sleep(2000);
    
    // 检查是否有错误消息
    const errorElements = await driver.findElements(By.css('[class*="error"], [class*="Error"]'));
    if (errorElements.length > 0) {
      const errorText = await errorElements[0].getText();
      throw new Error(`登录失败: ${errorText}`);
    }
    
    // 等待 URL 变化或等待登录后的元素出现（比如侧边栏、导航栏等）
    // 登录成功后会跳转到 / 或 /dashboard
    await driver.wait(async () => {
      const currentUrl = await driver.getCurrentUrl();
      const urlChanged = currentUrl !== `${BASE_URL}/login` && !currentUrl.includes('/login');
      
      if (urlChanged) {
        return true;
      }
      
      // 或者检查是否有登录后的元素（比如侧边栏）
      try {
        const sidebars = await driver.findElements(By.css('aside, [class*="sidebar"], [class*="Sidebar"]'));
        if (sidebars.length > 0) {
          return true;
        }
      } catch (e) {
        // 忽略查找错误
      }
      
      return false;
    }, 15000, '登录超时：页面未跳转或未找到登录后的元素');
    
    // 等待页面完全加载
    await driver.sleep(1000);
    console.log('登录成功');
  } catch (error) {
    // 如果超时，尝试获取当前页面信息用于调试
    const currentUrl = await driver.getCurrentUrl();
    console.error(`登录失败，当前 URL: ${currentUrl}`);
    throw error;
  }
}

/**
 * 等待元素可见并返回元素
 */
export async function waitForElement(driver, locator, timeout = 10000, errorMessage = '元素未找到') {
  return await driver.wait(
    until.elementLocated(locator),
    timeout,
    errorMessage
  );
}

/**
 * 等待元素可点击
 */
export async function waitForClickable(driver, element, timeout = 10000) {
  return await driver.wait(
    until.elementIsVisible(element),
    timeout,
    '元素不可点击'
  );
}

